home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / t_os / tset / environ.c next >
C/C++ Source or Header  |  1991-10-18  |  5KB  |  207 lines

  1. /*
  2.     環境変数領域操作関数(LsiC/HighC用)  by Y.Kurihara (Nifty PDC01620)
  3.  
  4.     Ver 1.00  1991.06.05
  5.     Ver 1.01  1991.06.10    マクロ HIGH_C を __HIGHC__ に変更
  6.     Ver 1.02  1991.07.18    ルートの COMMAND.COM の環境に対応
  7. */
  8.  
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <ctype.h>
  12. #include "environ.h"
  13.  
  14. #define MAXbuffer (128)
  15. static char buff[ MAXbuffer + 1 ];
  16.  
  17. /* * * * * * * * * * * *     LSI C86     * * * * * * * * * * * * */
  18. #if  defined( LSI_C )
  19.  
  20. int far_strnicmp( Fchar *s1,Fchar *s2,int len );
  21. Fchar *far_strncpy( Fchar *s1,Fchar *s2,int len );
  22.  
  23. #endif    /*  defined( LSI_C )  */
  24.  
  25. /* * * * * * * * * * * *      High C      * * * * * * * * * * * * */
  26. #if  defined( __HIGHC__ )
  27.  
  28. Fchar  *fp_dos;
  29. Fchar  *fp_psp;
  30.  
  31. int getpid( void )    /* RUN386.EXEのプロセスIDを得る */
  32. {
  33.     struct Fptr {  int off;  short seg;  };
  34.  
  35.     ( (struct Fptr *)&fp_psp ) -> seg = 0x24;
  36.     ( (struct Fptr *)&fp_psp ) -> off = 0x00;
  37.     ( (struct Fptr *)&fp_dos ) -> seg = 0x60;
  38.     ( (struct Fptr *)&fp_dos ) -> off = 0x00;
  39.  
  40.     return  *(Fint *)(fp_psp + 0x16);
  41. }
  42.  
  43. int far_strnicmp( Fchar *s1,Fchar *s2,int len )        /* 文字列の比較 */
  44. {
  45.     while( len-- > 0 ) {
  46.         if( toupper( *s1 ) != toupper( *s2 ) )  return(1);
  47.         if( *s1 == 0 )  break;
  48.         s1++;
  49.         s2++;
  50.     }
  51.     return( 0 );
  52. }
  53.  
  54. Fchar *far_strncpy( Fchar *s1,Fchar *s2,int len )    /* 文字列の複写 */
  55. {
  56.     while( len-- > 0 ) {
  57.         *s1 = *s2;
  58.         if( *s1 == 0 )  break;
  59.         s1++;
  60.         s2++;
  61.     }
  62.     return( 0 );
  63. }
  64.  
  65. #endif    /*  defined( __HIGHC__ )  */
  66.  
  67. /* * * * * * * * * * * *     COMMON      * * * * * * * * * * * * */
  68.  
  69. int getrpid( void )            /* rootのプロセスIDを得る */
  70. {                    /* (int 2eh のベクタのセグメント)  */
  71.     getpid();
  72.     return  *(Fint *)FARPTR( 0,0x2e *4 +2 );
  73. }
  74.  
  75. int getppid( void )            /* 親のプロセスIDを得る */
  76. {
  77.     return  PSP_parent( getpid() );
  78. }
  79.  
  80. int getcpid( void )            /* COMMAND.COMのプロセスIDを得る */
  81. {
  82.     unsigned psp,ppsp;
  83.  
  84.     psp  = getpid();
  85.     ppsp = PSP_parent( psp );
  86.     while( ppsp != psp ) {
  87.         ppsp = PSP_parent( psp = ppsp );
  88.     }
  89.     return( psp );
  90. }
  91.  
  92. int pspenv( int psp )            /* PSPの環境変数領域を得る */
  93. {
  94.     unsigned env;
  95.  
  96.     if( ( env = PSP_environ( psp ) )== 0 ) {
  97.                 /* 環境変数領域がPSPに設定されてない */
  98.         if( MCB_owner( psp ) != psp )  return( 0 );
  99.         env = MCB_next( psp );
  100.         if( MCB_owner( env ) != psp )  return( 0 );
  101.         if( envget( "COMSPEC",env ) == NULL )  return( 0 );
  102.         if( envget( "PATH",env ) == NULL )  return( 0 );
  103.         return( env );
  104.     }
  105.     if( MCB_mark( env ) != 'M' )  return( 0 );
  106.     if( MCB_size( env ) == 0 )  return( 0 );
  107.                 /* 環境変数領域がMCBの管理下にない */
  108.     if( MCB_owner( env ) != psp )  return( 0 );
  109.                 /* 環境変数領域がPSPの管理下にない */
  110.     return( env );
  111. }
  112.  
  113. int envdel( char *var,int env )            /* 環境変数の削除 */
  114. {
  115.     Fchar *ptr;
  116.     Fchar *p;
  117.     int  n;
  118.  
  119.     if( var == NULL || *var == 0 || env == 0 )  return(1);
  120.  
  121.     n = strlen( var );
  122.     ptr = FARPTR( env,0 );
  123.     while( *ptr ) {
  124.         if( !far_strnicmp( ptr,(Fchar *)var,n ) ) {
  125.             if( ptr[n] == 0 || ptr[n] == '=' ) {
  126.                 p = ptr;
  127.                 while( *ptr++ );
  128.                 while( *ptr )  while( (*p++ = *ptr++)!= 0 );
  129.                 *p = 0;
  130.                 if( *(p+1) == 1 )  *(p+1) = 0;
  131.                 return(0);
  132.             }
  133.         }
  134.         while( *ptr++ );
  135.     }
  136.     return(0);
  137. }
  138.  
  139. int envset( char *var,char *val,int env )    /* 環境変数の変更 */
  140. {
  141.     Fchar *fp_env;
  142.     int  size,n,c;
  143.  
  144.     if( envdel( var,env ) )  return(1);
  145.     if( val == NULL || *val == 0 )  return(0);
  146.  
  147.     fp_env  = FARPTR( env,0 );
  148.     size = MCB_size( env ) * 16 - 2;
  149.     for( n = 0; fp_env[ n ]; )  while( fp_env[ n++ ] );
  150.  
  151.     if( n >= size )  goto error2;
  152.     while( (c = *var++)!= 0 ) {
  153.         if( n >= size )  goto error1;
  154.         fp_env[ n++ ] = toupper( c );
  155.     }
  156.     if( n >= size )  goto error1;
  157.     fp_env[ n++ ] = '=';
  158.     while( (c = *val++)!= 0 ) {
  159.         if( n >= size )  goto error1;
  160.         fp_env[ n++ ] = c;
  161.     }
  162.     fp_env[ n ] = fp_env[ n+1 ] = 0;
  163.     if( fp_env[ n+2 ] == 1 )  fp_env[ n+2 ] = 0;
  164.     return(0);
  165.  
  166. error1:                /* 環境変数領域が足りない */
  167.     fp_env[ n ] = fp_env[ n+1 ] = 0;
  168.     if( fp_env[ n+2 ] == 1 )  fp_env[ n+2 ] = 0;
  169. error2:
  170.     return(1);
  171. }
  172.  
  173. char *envpath( int env )            /* 環境からパス名を得る */
  174. {
  175.     Fchar *fp_env;
  176.  
  177.     if( env == 0 )  return  NULL;
  178.  
  179.     fp_env  = FARPTR( env,0 );
  180.     while( *fp_env )  while( *fp_env++ );
  181.     if( fp_env[1] != 1 || fp_env[2] != 0 )  return  NULL;
  182.     far_strncpy( (Fchar *)buff,fp_env + 3,MAXbuffer );
  183.     buff[ MAXbuffer ] = 0;
  184.     return  buff;
  185. }
  186.  
  187. char *envget( char *var,int env )        /* 環境変数の値を得る */
  188. {
  189.     Fchar *ptr;
  190.     int  n;
  191.  
  192.     if( var == NULL || *var == 0 || env == 0 )  return  NULL;
  193.  
  194.     n = strlen( var );
  195.     ptr = FARPTR( env,0 );
  196.     while( *ptr ) {
  197.         if( !far_strnicmp( ptr,(Fchar *)var,n ) && ptr[n] == '=' ) {
  198.             far_strncpy( (Fchar *)buff,ptr + n + 1,MAXbuffer );
  199.             buff[ MAXbuffer ] = 0;
  200.             return  buff;
  201.         }
  202.         while( *ptr++ );
  203.     }
  204.     return  NULL;
  205. }
  206.  
  207.